home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NOVA - For the NeXT Workstation
/
NOVA - For the NeXT Workstation.iso
/
Apps
/
Utilities
/
Unix
/
WhosOnFirst
/
InfoMgr.m
< prev
next >
Wrap
Text File
|
1992-12-26
|
11KB
|
421 lines
#import "InfoMgr.h"
#import "DefaultMgr.h"
#import "myMainObject.h"
#import <stdlib.h>
#import <libc.h>
#import <appkit/Application.h>
#import <appkit/Window.h>
#import <appkit/View.h>
#import <appkit/Control.h>
#import <appkit/ActionCell.h>
#import <appkit/TextField.h>
#import <appkit/Button.h>
#import <appkit/OpenPanel.h>
#import <appkit/Matrix.h>
#import <sys/param.h>
id infoManager;
/*===========================================================================
File: InfoMgr.m
Purpose: This file is not just an infoManager. It is an
Info/Preferences manager. However, due to the constant
revisions (and no real code re-organizations) this file is
now the multi-purpose beast that it is. Re-organization
may take place at some later date.
===========================================================================*/
@implementation InfoMgr
- init
{
[super init];
generalView = infoView; /* See nib files for this one */
return self;
}
/*===========================================================================
Method: initDefaults
Purpose: To get the defaults from the default manager into instance
variables and interface objects.
Called: From appDidInit:sender
===========================================================================*/
- initDefaults
{
[speakMessages setStringValue:[defaultManager loginMessage] at:0];
[speakMessages setStringValue:[defaultManager logoutMessage] at:1];
[whenToSpeak selectCellAt: [defaultManager whenToSpeak] :0];
[doubleClickAction selectCellAt: [defaultManager doubleClickAction] :0];
[confirmDoubleClick setState:[defaultManager doubleClickConfirm]];
[[speakLog cellAt:0 :0] setState:[defaultManager speakLogin]];
[[speakLog cellAt:0 :1] setState:[defaultManager speakLogout]];
return self;
}
/*===========================================================================
Method: initSpeech: (const char *) dictPath
Purpose: To allocate and initialize the speech object.
Algorithm:
o Allocate and initialize speech object.
o Set the dictionary ordering to our preference
o set the Application dictionary path.
NOTE: The Application Dictionary (WhosOnFirst.preditor) is located
in WhosOnFirst.app/. However, because the speech object is
communicating with a Speech Server, the server has no idea
where WhosOnFirst.app is located in the directory hierarchy.
Therefore, the full path to the dictionary file must be
provided to this method. Please see myMainObject.m,
-appDidInit:sender for more code. See TextToSpeech Kit
documentation for a description of the setAppDictPath:
method.
Compilation of this method is conditional. See
Makefile.preamble to set up conditional compilation flags.
===========================================================================*/
#ifdef SPEECH
- initSpeech:(const char *) dictPath
{
short dictOrder[5] = { TTS_NUMBER_PARSER, TTS_USER_DICTIONARY, TTS_APPLICATION_DICTIONARY,
TTS_MAIN_DICTIONARY, TTS_LETTER_TO_SOUND};
if (!mySpeech) mySpeech = [[TextToSpeech alloc] init];
if (mySpeech == nil)
{
sleep(5);
mySpeech = [[TextToSpeech alloc] init]; /* Avoid high load problems */
}
if (mySpeech == nil)
{
if ([[whenToSpeak selectedCell] tag]!=SPEECHOFF)
{
if (NXRunAlertPanel("TextToSpeech","Could not launch TextToSpeech Server", "Disable Speech",
"Ignore", NULL)==1) [whenToSpeak selectCellAt: 0 :0];
}
}
else
{
[mySpeech setDictionaryOrder: dictOrder];
[mySpeech setAppDictPath: dictPath];
}
return self;
}
#endif
/*===========================================================================
Method: cleanUp
Purpose: To update the defaults manager in preparation for
application termination.
===========================================================================*/
- cleanUp
{
int temp;
temp = [[whenToSpeak selectedCell] tag];
[defaultManager setWhenToSpeak:temp];
temp = [[doubleClickAction selectedCell] tag];
[defaultManager setDoubleClickAction:temp];
[defaultManager setLoginMessage: [speakMessages stringValueAt:0]];
[defaultManager setLogoutMessage: [speakMessages stringValueAt:1]];
[defaultManager setSpeakLogin: (BOOL)[[speakLog cellAt:0 :0] state]];
[defaultManager setSpeakLogout: (BOOL)[[speakLog cellAt:0 :1] state]];
[defaultManager setDoubleClickConfirm: (BOOL)[confirmDoubleClick state]];
return self;
}
/*===========================================================================
Method: switchViews:sender
Purpose: To switch the view hierarchy based on the selection of the
pop-up menu on the info panel
===========================================================================*/
- switchViews:sender
{
[window disableFlushWindow];
[generalView removeFromSuperview];
switch ([[sender selectedCell] tag])
{
case 0:
[[window contentView] addSubview:infoView];
generalView = infoView;
break;
case 1:
[[window contentView] addSubview:speechView];
generalView = speechView;
break;
case 2:
[[window contentView] addSubview:speechControlView];
generalView = speechControlView;
break;
case 3:
[[scrollView docView] display];
[[window contentView] addSubview:iconInfoView];
generalView = iconInfoView;
break;
case 4:
[[window contentView] addSubview:TextToSpeechView];
generalView = TextToSpeechView;
break;
case 5:
[[window contentView] addSubview:LicenceView];
generalView = TextToSpeechView;
break;
}
[[window contentView] display];
[window reenableFlushWindow];
[window flushWindow];
return self;
}
/*===========================================================================
Method: doubleClickEvent
Purpose: An IconView will receive any double click events. This
method is here to provide IconView with information about
what is to be done in the event of a double click.
===========================================================================*/
-(int) doubleClickEvent
{
return([[doubleClickAction selectedCell] tag]);
}
/*===========================================================================
Method: confirmDoubleClick
Purpose: If the user has requested confirmation of Double Click
events, display a panel with message supplied in the variable
"message" return the value returned by the panel.
If the user has not requested confirmation of double clicks,
simply return true.
===========================================================================*/
-(int) confirmDoubleClick:(const char *) message
{
if (![confirmDoubleClick state])
return(1);
else
return(NXRunAlertPanel("Double Click Confirmation", message, "Ok", "Cancel", NULL));
}
#ifndef SPEECH
- enableSpeech:sender
{
return self;
}
#endif
/*===========================================================================
Compilation of the following methods is conditional. See
Makefile.preamble to set up conditional compilation flags.
===========================================================================*/
#ifdef SPEECH
- enableSpeech:sender
{
char dictPath[256];
const char *appPath;
if (mySpeech) return self;
if ([[whenToSpeak selectedCell] tag] != SPEECHOFF)
{
appPath = [mainObject appDirectory];
strcpy(dictPath, appPath);
strcat(dictPath, "/WhosOnFirst.preditor");
/* Initialize the speech. Include the application dictionary.*/
[self initSpeech:dictPath];
}
return self;
}
/*===========================================================================
Method:speakLoginMessage
Purpose: Given the user's preference settings, speak the appropriate
login message.
===========================================================================*/
- speakLoginMessage:(const char *) user tty:(const char *) tty host:(const char *) host
{
char tempHostName[MAXHOSTNAMELEN];
if ([[speakLog cellAt:0 :0] state]) /* Speak login messages? */
switch([[whenToSpeak selectedCell] tag]) /* Get message from info panel */
{
case SPEECHOFF: /* No Speech */
break;
case ANYUSER: /* Speak for any user */
[self speakFormatString: [speakMessages stringValueAt:0]
name: user tty:tty host:host];
break;
case OTHERUSERS: /* Speak for other users */
if (strcmp(getlogin(), user))
[self speakFormatString: [speakMessages stringValueAt:0]
name: user tty:tty host:host];
break;
case REMOTEUSERS: /* Speak for remote users */
gethostname(tempHostName, MAXHOSTNAMELEN);
if (strcmp(host, tempHostName))
[self speakFormatString: [speakMessages stringValueAt:0]
name: user tty:tty host:host];
break;
}
return self;
}
/*===========================================================================
Method:speakLogoutMessage
Purpose: Given the user's preference settings, speak the appropriate
logout message.
===========================================================================*/
- speakLogoutMessage:(const char *) user tty:(const char *) tty host:(const char *) host
{
char tempHostName[MAXHOSTNAMELEN];
if ([[speakLog cellAt:0 :1] state]) /* Speak logout messages? */
switch([[whenToSpeak selectedCell] tag])
{
case SPEECHOFF: /* No Speech */
break;
case ANYUSER: /* Speak for any user */
[self speakFormatString: [speakMessages stringValueAt:1]
name: user tty:tty host:host];
break;
case OTHERUSERS: /* Speak for other users */
if (strcmp(getlogin(), user))
[self speakFormatString: [speakMessages stringValueAt:1]
name: user tty:tty host:host];
break;
case REMOTEUSERS: /* Speak for remote users */
gethostname(tempHostName, MAXHOSTNAMELEN);
if (strcmp(host, tempHostName))
[self speakFormatString: [speakMessages stringValueAt:1]
name: user tty:tty host:host];
break;
}
return self;
}
/*===========================================================================
Method: SpeakFormatString: format
name: user
tty: tty
host: host
Purpose: Given that a message is to be spoken, get the message format
string from the info panel and construct a speak message
which conforms to the format string.
===========================================================================*/
- speakFormatString:(const char *) format name:(const char *) user tty:(const char *) tty host:(const char *) host
{
int i, j = 0, k = 0;
char finalString[1024];
bzero(finalString, 1024);
i = strlen(format);
while(j<i)
{
switch(format[j])
{
case '%':switch(format[j+1])
{
/* Insert login name */
case 'u': strncat(finalString, user, 8);
j+=2;
break;
/* Insert host name */
case 'h': strcat(finalString, host);
j+=2;
break;
/* Insert tty name */
case 't': strcat(finalString, tty);
j+=2;
break;
/* A single % sign. */
default: finalString[k] = '%';
break;
}
k = strlen(finalString);
break;
default: finalString[k++] = format[j++];
break;
}
}
if (!mySpeech) [self enableSpeech:self];
/* Here we are! Actually tell the speech object to Speak the message :-) */
[mySpeech speakText:finalString];
return self;
}
#endif
@end